﻿//
// GrepEngine
//
// Copyright (C) 2011 - Tatsuya Niioka
//
using System.Text;

namespace GrepEngine
{
    /// <summary>
    /// Grepヘルパークラス
    /// </summary>
    public class GrepHelper
    {
        #region GetIndentToTab
        /// <summary>
        /// インデントをタブに変換します。
        /// </summary>
        /// <param name="value">文字列</param>
        /// <param name="tabSize">タブサイズ</param>
        /// <returns>変換後の文字列</returns>
        public static string GetIndentToTab(string value, int tabSize)
        {
            StringBuilder output = new StringBuilder();
            int size = 0;
            for (int idx = 0; idx < value.Length; idx++)
            {
                char ch = value[idx];
                if (ch == '\t')
                {
                    if (size % tabSize == 0)
                    {
                        size += tabSize;
                    }
                    else
                    {
                        size += size % tabSize;
                    }
                }
                else if (ch == ' ')
                {
                    size++;
                }
                else
                {
                    if (size > 0)
                    {
                        output.Append('\t', size / tabSize);
                        if (size % tabSize != 0)
                        {
                            output.Append('\t');
                        }
                    }
                    output.Append(value.Substring(idx));
                    break;
                }
            }
            return output.ToString();
        }
        #endregion

        #region GetIndentToSpace
        /// <summary>
        /// インデントを空白に変換します。
        /// </summary>
        /// <param name="value">文字列</param>
        /// <param name="tabSize">タブサイズ</param>
        /// <returns>変換後の文字列</returns>
        public static string GetIndentToSpace(string value, int tabSize)
        {
            StringBuilder output = new StringBuilder();
            int size = 0;
            for (int idx = 0; idx < value.Length; idx++)
            {
                char ch = value[idx];
                if (ch == '\t')
                {
                    if (size % tabSize == 0)
                    {
                        size += tabSize;
                    }
                    else
                    {
                        size += size % tabSize;
                    }
                }
                else if (ch == ' ')
                {
                    size++;
                }
                else
                {
                    if (size > 0)
                    {
                        output.Append(' ', size);
                    }
                    output.Append(value.Substring(idx));
                    break;
                }
            }
            return output.ToString();
        }
        #endregion

        #region GetWordRegex
        /// <summary>
        /// 指定した検索文字列から単語単位検索の正規表現文字を取得します。
        /// </summary>
        /// <param name="value">検索文字列</param>
        /// <returns>単語単位の検索文字列</returns>
        public static string GetWordRegex(string value)
        {
            return "\\b" + value + "\\b";
        }
        #endregion

        #region GetWildCardRegex
        /// <summary>
        /// 指定したワイルドカードから正規表現文字列を取得します。
        /// </summary>
        /// <param name="value">ワイルドカード文字列</param>
        /// <returns>正規表現文字列</returns>
        public static string GetWildCardRegex(string value)
        {
            StringBuilder output = new StringBuilder();
            foreach (char ch in value)
            {
                if (ch == '?')
                {
                    output.Append('.');
                }
                else if (ch == '*')
                {
                    output.Append(".*");
                }
                else
                {
                    output.Append(ch);
                }
            }
            return output.ToString();
        }
        #endregion
    }
}
